
from PySide6.QtSql import QSqlQueryModel
from PySide6.QtCore import Qt

class SqlQueryModelClass(QSqlQueryModel):
    def __init__(self):
        super().__init__()
        self.tableName = ''
    # 设置表头
    def setHeaderDatas(self, DataList):
        for i in range(len(DataList)):
            self.setHeaderData(i, Qt.Horizontal, DataList[i])
    
    # 记录查询
    def recordQueryByDataList(self, DataList,limitIndex,PageRecordCount):
        key = "".join(DataList[i]+"," for i in range(len(DataList)))
        key = key[:-1]
        szQuery = (f"select {key} from {self.tableName} limit %d,%d" % (limitIndex, PageRecordCount))
        print('query sql=' + szQuery)
        self.setQuery(szQuery)
        
    # 记录查询
    def recordQueryAll(self, limitIndex,PageRecordCount):
        szQuery = (f"select * from {self.tableName} limit %d,%d" % (limitIndex, PageRecordCount))
        print('query sql=' + szQuery)
        self.setQuery(szQuery)
    #=======================================================================================#
    ###
    ######## 1.查询数据
    """
    根据字段查询文件信息。

    Args:
        file_id (str): 字段名。
        val (str): 字段的具体值。

    Returns:
        None: 该函数直接执行数据库查询操作，无返回值。

    Raises:
        无特定异常抛出，但执行过程中可能会遇到数据库相关的异常。

    """
    def queryByFileId(self, file_id,val):
        szQuery = (f"select * from {self.tableName} where {file_id} = '{val}'")
        print('query sql=' + szQuery)
        self.setQuery(szQuery)
    ###
    #=======================================================================================#
    
    #=======================================================================================#
    ###
    ######## 2.按标题关键字查询数据
    """
    根据标题模糊查询文件信息。

    Args:
        title_key (str): 文件标题的模糊查询关键字。

    Returns:
        None: 该函数不返回任何值，而是将查询结果设置到类的内部属性中。

    """
    def queryByLikeFitle(self,title_key):
        szQuery = (f"select * from {self.tableName} where title like '%{title_key}%'")
        print('query sql=' + szQuery)
        self.setQuery(szQuery)
    
    ###
    #=======================================================================================#
    #=======================================================================================#
    ###
    ######## 4.根据日期范围查询接收文件记录
    #SELECT * FROM your_table_name WHERE date >= '2023-01-01' AND date <= '2024-12-31';
    """
    根据日期范围查询接收文件记录。

    Args:
        start_date (str): 查询开始日期，格式为 'YYYY-MM-DD'。
        end_date (str): 查询结束日期，格式为 'YYYY-MM-DD'。

    Returns:
        None: 该函数直接执行查询操作，不返回任何结果。

    """
    def queryByDate(self, start_date, end_date):
        szQuery = (f"select * from {self.tableName} where date >= '{start_date}' AND date <= '{end_date}'")
        print('query sql=' + szQuery)
        self.setQuery(szQuery)
    ###
    #=======================================================================================#

                
if __name__ == "__main__":
    import os,sys
    from PySide6.QtWidgets import QWidget, QMessageBox,QTableView,QHeaderView,QApplication
    from PySide6.QtSql import QSqlDatabase
    os.chdir(os.path.dirname(__file__))
    
    app = QApplication(sys.argv)
    # 打开数据库，该库由qt_createSql.py脚本创建。
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('../db/filedatabase.db')
    if db.open() is not True:
        QMessageBox.critical(QWidget, 'open error', '数据库打开失败')
        exit()
    from PySide6.QtCore import *
    from PySide6.QtWidgets import QApplication, QTextBrowser,QVBoxLayout, QHBoxLayout
    class SqlQueryModelDemo(QTextBrowser):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("分页查询案例-只读")
            self.resize(750, 300)
                    # 设置表格属性
            self.tableView = QTableView()
            self.queryModel = SqlQueryModelClass()

            # 表格宽度的自适应调整
            self.tableView.horizontalHeader().setStretchLastSection(True)
            #self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
            self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
            # 表格高度的自适应调整
            #self.tableView.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)

            self.tableView.setStyleSheet("QTableView QTableCornerButton::section,QHeaderView::section { height: 50px;}")
            mainLayout = QVBoxLayout(self)

            mainLayout.addWidget(self.tableView)
            self.setLayout(mainLayout)
            self.queryModel.recordQueryAll(0, 5)
            self.queryModel.setHeaderDatas(['编号', '序号', '时间', '标题', '文号', '类型', '单位', '归档', '路径'])
            self.tableView.setModel(self.queryModel)
            #print(self.queryModel.getTotalRecordCount())
            itemObj = {
                "id": 37,
                "date": "2021-08-31",
                "file_id": "0012",
                "title": "测试标题",
                "number": 100,
                "type": "测试类型",
                "unit": "测试单位",
                "file": "测试文件",
                "src": "测试来源"
            }
            #self.queryModel.recordQueryByDataList(['id', 'date', 'file_id', 'file_id'],0,10)
            
            
    sqlview = SqlQueryModelDemo()
    sqlview.show()
    sys.exit(app.exec())
            